#include "loger.hpp"
#include "spdlog/spdlog.h"

static sl::loger::Level g_LogLevel = sl::loger::Level::LOG_INFO;

void sl::loger::__detail::init()
{
    spdlog::set_level(spdlog::level::debug);
}

void sl::loger::setLevel(Level level)
{
    switch(level) {
    case Level::LOG_DEBUG:
        g_LogLevel = sl::loger::Level::LOG_DEBUG;
        break;
    case Level::LOG_INFO:
        g_LogLevel = sl::loger::Level::LOG_INFO;
        break;
    case Level::LOG_WARN:
        g_LogLevel = sl::loger::Level::LOG_WARN;
        break;
    case Level::LOG_ERROR:
        g_LogLevel = sl::loger::Level::LOG_ERROR;
        break;
    }
}

sl::loger::Level sl::loger::getLevel()
{
    return g_LogLevel;
}

template <>
void sl::loger::__detail::loger<sl::loger::Level::LOG_DEBUG>(
    const std::string_view str)
{
    spdlog::debug(str);
}
template <>
void sl::loger::__detail::loger<sl::loger::Level::LOG_INFO>(
    const std::string_view str)
{
    spdlog::info(str);
}
template <>
void sl::loger::__detail::loger<sl::loger::Level::LOG_WARN>(
    const std::string_view str)
{
    spdlog::warn(str);
}
template <>
void sl::loger::__detail::loger<sl::loger::Level::LOG_ERROR>(
    const std::string_view str)
{
    spdlog::error(str);
}
